'''
因为公司里面的销售NB，所有产品就基本上都是一个传声筒，至于领导时不时的在秀一下存在感
运营呢全部都怕麻烦，所以公司的项目就一坨乱麻
公司的项目已经运行好长时间了，并且绝大多的业务都是口口相传，所以后来接手的研发啥东西都不敢动。

本次业务需求：
    积分系统：
        业主绑定经济人的时候加分
        业主发布房评（语音版）
        业主发布房评（文字版）
        业主修改房评（语音版）
        业主修改房评（文字版）
        上传两证一委（售委托）
        上传两证一委（租委托）
        上传两证一委（租售委托）
        。。。。。。
        发生以上事件的时候需要给对应的 业主 添加响应的积分（调用外部接口）

        问题来了，绝大多数的程序代码不敢动，老大也不让动（之前有一个姐们修改了一个方法导致APP端出事了）。

        不动原有的逻辑，所以这里我使用了  装饰者模式
'''
class Service(object):
    '''所有业务的公共基类'''
    def __init__(self):
        pass;

class IRegistertrusts(Service):
    '''业主委托 接口类 为装饰者定制的'''
    def __init__(self):
        pass;

    #添加业主委托，子类实现具体业务
    def addPropertyTrustRecord(self):
        pass;

class Registertrusts(IRegistertrusts):
    '''业主委托'''
    def __init__(self):
        pass;

    #添加业主委托
    def addPropertyTrustRecord(self):
        print('各种验证')
        print('乱七八糟的业务')
        print('业主信息特殊处理')
        print('新增操作日志')


class BaseDecorator(IRegistertrusts):
    ''' 装饰者基类 '''
    def __init__(self):
        pass;

    #装饰
    def MethodDecorator(self):
        pass;


class SendInformation(IRegistertrusts):
    ''' 业主委托装饰者 -- 发送系统消息给业务员 
        继承 业主委托 接口类
    '''
    #registertrusts = None;
    def __init__(self, IRegistertrusts):
        self.registertrusts = IRegistertrusts;

    def MethodDecorator(self):
        ''' 装饰者逻辑 '''
        print('SendInformation-----发送系统消息');

    def addPropertyTrustRecord(self):
        self.MethodDecorator();
        self.registertrusts.addPropertyTrustRecord();


class EmpCusRelations(IRegistertrusts):
    ''' 业主委托装饰者 -- 绑定经纪人 
        继承 业主委托 接口类
    '''
    #registertrusts = None;
    def __init__(self, IRegistertrusts):
        self.registertrusts = IRegistertrusts;

    def MethodDecorator(self):
        ''' 装饰者逻辑 '''
        print('EmpCusRelations-----绑定经纪人');

    def addPropertyTrustRecord(self):
        self.registertrusts.addPropertyTrustRecord();
        self.MethodDecorator();

if __name__ == '__main__':
    #obj = Registertrusts();
    #obj.addPropertyTrustRecord()
    #上面为原有逻辑
    '''
    装饰者模式
    所有的装饰者，都必须继承同一个基类 (装饰者就是产品新提的需求)
    '''
    #原有业务实例
    obj = Registertrusts();
    #装饰者一实例  发送系统消息
    send = SendInformation(IRegistertrusts = obj);
    #调用装饰者方法
    send.addPropertyTrustRecord();
    print('{:*^50}'.format('分割线'))
    emp = EmpCusRelations(send);
    emp.addPropertyTrustRecord();

'''
    整个Python的装饰者模式完成
    原有的代码中只修改了 Registertrusts 业主委托类型的基类
    定义了一个 IRegistertrusts 类型
    所有的装饰者类都继承与 IRegistertrusts 类型
    如果后续再有围绕着 Registertrusts 的新需求可以再原有代码上继续进行扩展

    新增的类型有
        IRegistertrusts     公共基类         通过该类型调度原有的逻辑和装饰者业务
        BaseDecorator       装饰者基类       制定所有装饰者的标准
        SendInformation     装饰者业务一     编写独有的业务逻辑
        EmpCusRelations     装饰者业务二     编写独有的业务逻辑

'''

